home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / HyperCard / RTF XCMDs 1.3 / RTFToField.c < prev    next >
C/C++ Source or Header  |  1993-03-29  |  4KB  |  223 lines

  1. /*
  2.  * This software is copyright 1992 by Robert Morris.
  3.  * You may freely redistribute this software as shareware
  4.  * if you do so in the same form as you got it. If you find
  5.  * this software useful, please send $12 to:
  6.  *   Robert Morris
  7.  *   P.O. Box 1044
  8.  *   Harvard Square Station
  9.  *   Cambridge, MA 02238
  10.  *   ecognome@aol.com
  11.  * If you incorporate any of this software in any kind of
  12.  * commercial product, please send $2 per copy distributed
  13.  * to the above address.
  14.  */
  15.  
  16. /*
  17.  * Changes since 1.2:
  18.  *  fixed a memory leak in CvtMyStyleHandle.
  19.  *  set last styleIndex to -1, and last startChar to length+1.
  20.  *  eliminated trailing null in text.
  21.  *  allow field id as well as field name.
  22.  */
  23.  
  24. /*
  25.  * RTFToField(rtf-text, cardflag, fieldname)
  26.  */
  27.  
  28. #include <HyperXCmd.h>
  29. #include <stdlib.h>
  30. #include <ctype.h>
  31. #include "SetUpA4.h"
  32. #include <string.h>
  33. #include "lists.h"
  34. #include "rtf.h"
  35.  
  36. #define DUMP 0
  37.  
  38. XCmdPtr xptr;
  39. void error(char *);
  40. int goterror;
  41. Handle HStr(char *);
  42. void DumpField(TEHandle teh, struct list *out);
  43.  
  44. pascal void
  45. main(paramPtr)
  46. XCmdPtr paramPtr;
  47. {
  48.     int i, fieldID, fieldNum;
  49.     TEHandle teh;
  50.     char fieldname[256];
  51.     Boolean cardFld;
  52.     TEStyleHandle sh1;
  53.     MyStyleHandle sh;
  54.     Handle txt, txt1;
  55.     struct list flds;
  56.     long start, nstart, txtlen;
  57.     OSErr err;
  58. #if DUMP
  59.     struct list dump;
  60. #endif
  61.     
  62.     RememberA0();
  63.     SetUpA4();
  64.     
  65.     xptr = paramPtr;
  66.     goterror = 0;
  67.     teh = 0;
  68.     sh = 0;
  69.     sh1 = 0;
  70.     txt = 0;
  71. #if DUMP
  72.     dump.h = 0;
  73. #endif
  74.  
  75.     if(paramPtr->paramCount != 3){
  76.         error("error : usage RTFToField(rtf-text, cardflag, fieldname)\rCopyright 1992 Robert Morris.");
  77.         goto out;
  78.     }
  79.     
  80.     parsertf(paramPtr->params[0], &sh, &txt);
  81.  
  82.     if(goterror)
  83.         goto out;
  84.     
  85.     if(strcmp(*(paramPtr->params[1]), "false") == 0)
  86.         cardFld = FALSE;
  87.     else
  88.         cardFld = TRUE;
  89.         
  90.     start = 0;
  91.     txtlen = GetHandleSize(txt);
  92.     NewList(paramPtr->params[2], &flds);
  93.     while(ReadListLine(&flds, fieldname) != -1){
  94.         if(isdigit(fieldname[0])){
  95.             fieldID = atoi(fieldname);
  96.             fieldNum = 0;
  97.         } else {
  98.             CtoPstr(fieldname);
  99.             fieldID = fieldNum = 0;
  100.         }
  101.     
  102.         teh = GetFieldTE(paramPtr, cardFld, fieldID, fieldNum,
  103.                          fieldID ? 0 : (StringPtr)fieldname);
  104.         if(teh == 0 || paramPtr->result != xresSucc){
  105.             error("error : no such field");
  106.             goto out;
  107.         }
  108.         
  109.         sh1 = GetStylHandle(teh);
  110.         if(sh1 == 0){
  111.             error("error : GetStylHandle() failed");
  112.             goto out;
  113.         }
  114.     
  115.         nstart = start;
  116.         err = CvtMyStyleHandle(sh, &nstart, sh1, 30000L, txt);
  117.         if(err != 0){
  118.             error("error : out of memory");
  119.             goto out;
  120.         }
  121.  
  122.         /* TESetText() destroys existing style information */
  123.         HLock(txt);
  124.         TESetText(*txt + start, nstart - start, teh);
  125.         HUnlock(txt);
  126.         
  127.         /* so re-compute styles! */
  128.         nstart = start;
  129.         err = CvtMyStyleHandle(sh, &nstart, sh1, 30000L, txt);
  130.  
  131. #if DUMP        
  132.         if(dump.h == 0)
  133.             DumpField(teh, &dump);
  134. #endif
  135.  
  136.         SetFieldTE(paramPtr, cardFld, fieldID, fieldNum,
  137.                    fieldID ? 0 : (StringPtr)fieldname, teh);
  138.         
  139.         TEDispose(teh);
  140.         teh = 0;
  141.         
  142.         start = nstart;
  143.     }
  144.  
  145. out:
  146.     if(sh)
  147.         DisposMyStyleHandle(sh);
  148.     if(teh)
  149.         TEDispose(teh);
  150.     if(txt)
  151.         DisposHandle(txt);
  152.     if(goterror && paramPtr->returnValue == 0)
  153.         paramPtr->returnValue = HStr("error : out of memory!");
  154. #if DUMP
  155.     if(goterror == 0)
  156.         paramPtr->returnValue = dump.h;
  157. #endif
  158.     RestoreA4();
  159. }
  160.  
  161. #if DUMP
  162. void
  163. DumpField(TEHandle teh, struct list *out)
  164. {
  165.     int sprintf(char *, const char *, ...);
  166.     STHandle st;
  167.     TEStyleHandle sh;
  168.     Handle txt;
  169.     char tmp[256];
  170.     long i;
  171.     
  172.     sh = GetStylHandle(teh);
  173.     if(sh == 0){
  174.         error("error : GetStylHandle() failed");
  175.         return;
  176.     }
  177.  
  178.     st = (*sh)->styleTab;
  179.     txt = (Handle)TEGetText(teh);
  180.  
  181.     NewList(0L, out);
  182.     
  183.     sprintf(tmp, "teLength %d, real length %ld\r",
  184.         (*teh)->teLength, GetHandleSize(txt));
  185.     AppendList(out, tmp);
  186.     
  187.     sprintf(tmp, "nRuns %d nStyles %d record len %ld\r",
  188.         (*sh)->nRuns, (*sh)->nStyles, GetHandleSize(sh));
  189.     AppendList(out, tmp);
  190.     
  191.     for(i = 0; i <= (*sh)->nRuns; i++){
  192.         sprintf(tmp, " %ld: start %d index %d\r",
  193.             i, (*sh)->runs[i].startChar, (*sh)->runs[i].styleIndex);
  194.         AppendList(out, tmp);
  195.     }
  196.         
  197.     sprintf(tmp, "styleTab len %ld\r",
  198.         GetHandleSize(st));
  199.     AppendList(out, tmp);
  200. }
  201. #endif
  202.  
  203. Handle
  204. HStr(str)
  205. char *str;
  206. {
  207.     Handle newHndl;
  208.     
  209.     newHndl = (Handle) NewHandle((long) strlen(str) + 1);
  210.     if(newHndl == 0)
  211.         return(0);
  212.     strcpy((char *) (*newHndl), str);
  213.     return(newHndl);
  214. }
  215.  
  216. void
  217. error(s)
  218. char *s;
  219. {
  220.     if(goterror == 0)
  221.         xptr->returnValue = HStr(s);
  222.     goterror = 1;
  223. }